<?php
App::import('Model', 'news.NewsCategory');
App::import('Model', 'news.I18nNews');
class News extends AppModel {
	var $name = 'News';
	var $useTable = 'news';
	
	/**
	 * @var $translateModel Translate Model
	 **/
	var $translateModel = 'I18nNews';
	
	/**
	 * @var $translateTable Translate table
	 **/
	var $translateTable = 'i18n_news';
	/**
	 * @var $hasAndBelongsToMany
	 * @brief Biến dùng để ràng buộc dữ liệu đầu vào
	 */
	var $hasAndBelongsToMany = array(
		'Category' => array(
			'className' => 'NewsCategory',
			'joinTable' => 'news_middle',
			'foreignKey' => 'page_id',
			'associationForeignKey' => 'category_id',
			'unique' => true,
			'conditions' => '',
			'fields' => '',
			'order' => '',
			'limit' => '',
			'offset' => '',
			'finderQuery' => '',
			'deleteQuery' => '',
			'insertQuery' => ''
		)
	);
	
	/**
	 * @var $actsAs
	 * @brief Biến dùng để cấu hình
	 */
	var $actsAs = array(
		'EditablePage',
		'Sluggable'	=>	array(
			'label'	=>	'title',
			'alias'	=>	'alias'
		),
		'HasSingleImage'	=>	array(
			'image_field'	=>	'image'
		),
		'ExtendedValidation',
		'ExtendedConfiguration'	=> array(
			'configFilename'		=>	'news.config',
			'names'		=> array('News', 'View', 'Manage'),
			'merge'		=>	array(
				array(
					'settings'	=>	array(
						'configFilename'	=>	'editable_pages.config',
						'names'				=>	array('EditablePage', 'View', 'Manage'),
						'overrides'		=>	array(
							'EditablePage'	=>	'News'
						)
					),
				),
				array(
					'settings'	=>	array(
						'configFilename'	=>	'news.category_configs',
						'names'				=>	array('Category'),
						'reloadConfig'		=> true
					),
				)
			),
			'cacheName'	=>	'manage_news_configs'
		),
		'Containable',
		'Translate'	=>	array('title', 'description', 'content'),
		'ExtendedTranslate'
	);
	
	
	/**
	 * @var $validate
	 * @brief Biến dùng để ràng buộc dữ liệu đầu vào
	 */
	var $validate = array(
		'title'	=>	array(
			'rule-title-1'	=>	array(
				'rule'	=>	'notempty',
				'message'	=>	"Tiêu đề tin không được để trống",
			)
		),
		'description'	=>	array(
			'rule-description-1'	=>	array(
				'rule'	=>	'notempty',
				'message'	=>	"Mô tả về tin không được để trống",
			)
		),
		'content'	=>	array(
			'rule-content-1'	=>	array(
				'rule'	=>	'notempty',
				'message'	=>	"Nội dung tin không được để trống",
			)
		)
	);
	
	/**
	 * 
	 * Phương thức được sử dụng để lấy ra những tin mới nhất
	 * @param $catId ID của danh mục cần lấy những tin mới nhất
	 * @param $fields Danh sách các trường dữ liệu cần lấy ra
	 * @param $limit Số lượng bản ghi cần lấy ra
	 * @param $offset Vị trí dữ liệu đầu tiên lấy ra
	 */
	function getTopNews($catId, $fields, $limit, $offset=0) {
		$records = $this->find('all', array(
			'conditions'	=>	array("Middle.category_id" => $catId),
			'fields'		=>	$fields,
			'joins'			=>	array(
				array(
					'table'			=>	$this->hasAndBelongsToMany['Category']['joinTable'],
					'type'			=>	'INNER',
					'alias'			=>	'Middle',
					'conditions'	=>	array("News.id = Middle.page_id")
				)
			),
			'order'			=>	array('created desc'),
			'limit'			=>	$limit
		));
		
		return $records;
	}
	
	/**
	 * 
	 * Enter description here ...
	 * @param unknown_type $alias
	 * @param unknown_type $category_alias
	 * @param unknown_type $fields
	 * @param unknown_type $limit
	 * @param unknown_type $options
	 */
	function getNewerNews($alias, $category_alias, $fields, $limit, $options = array()) {
		$current_news = $this->find('first', array(
			'conditions'	=>	array("News.alias"	=>	$alias),
		));
		
		$records = $this->find('all', array(
			'conditions'	=>	array(
				"Category.alias"	=>	$category_alias,
				"News.is_published"	=> 1,
				"News.news_date > '{$current_news['News']['news_date']}'"
			),
			'fields'		=>	$fields,
			'limit'			=>	$limit,
			'order'			=>	array(
				'News.news_date asc',
				'News.created asc'
			),
			'joins' => array(
				array(
					'table' => $this->hasAndBelongsToMany['Category']['joinTable'],
					'type' => 'INNER',
					'alias' => 'ReferenceCategory',
					'conditions' => array(
						"News.id = ReferenceCategory.page_id"
					)
				),
				array(
					'table' => $this->Category->table,
					'type' => 'INNER',
					'alias' => 'Category',
					'conditions' => array(
						'Category.id = ReferenceCategory.category_id'
					)
				)
			),
		));
		$records = array_reverse($records, true);

		return $records;
	}
	/**
	 * 
	 *
	 */
	function getOlderNews($alias, $category_alias, $fields, $limit, $options = array()) {
		$current_news = $this->find('first', array(
			'conditions'	=>	array("News.alias"	=>	$alias),
		));
		
		$records = $this->find('all', array(
			'conditions'	=>	array(
				"Category.alias"	=>	$category_alias,
				"News.is_published"	=> 1,
				"News.news_date < '{$current_news['News']['news_date']}'"
			),
			'fields'		=>	$fields,
			'limit'			=>	$limit,
			'order'			=>	array(
									'News.news_date desc',
									'News.created desc'
								),
			'joins' => array(
				array(
					'table' => $this->hasAndBelongsToMany['Category']['joinTable'],
					'type' => 'INNER',
					'alias' => 'ReferenceCategory',
					'conditions' => array(
						"News.id = ReferenceCategory.page_id"
					)
				),
				array(
					'table' => $this->Category->table,
					'type' => 'INNER',
					'alias' => 'Category',
					'conditions' => array(
						'Category.id = ReferenceCategory.category_id'
					)
				)
			),
		));
		return $records;
	}
	
	/**
	 * Hàm lấy các tin mới nhất khi truyền alias của categories và các 
	 * biến khác vào hàm
	 */
	function getNewestNews($category_alias, $fields, $limit, $options = array()) {
		if (!isset($options['order'])) {
			$options['order'] = "News.news_date desc, News.created desc";
		}
		
		if (!isset($options['contain'])) {
			$options['contain'] = array();
		}
		if($category_alias != null){
            $newestnews = $this->find('all', array(
                'fields'        => $fields,
                'conditions'    => array(
                						'Category.alias' => $category_alias,
            							'News.is_published'	=> 1	
            						),
            	'order'			=>	array(
										'News.news_date desc',
										'News.created desc'
									),
                'joins'       	=> array(
                    array(
                        'table' => $this->hasAndBelongsToMany['Category']['joinTable'],
                        'alias' => 'Middle',
                        'type'  => 'INNER',
                        'conditions'=> array("Middle.page_id = News.id")
                    ),
                    array(
                        'table' => $this->Category->table, //categories
                        'alias' => 'Category',
                        'type'  => 'INNER',
                        'conditions'=> array("Category.id = Middle.category_id")
                    )
                ),
                'limit'		=>	$limit
            ) + $options);
        }
       return $newestnews;
	}
	
	/**
	 * ------------------------ Các phương thức của Editable Page --------------------------
	 */
	/**
	 * Phương thức được sử dụng để xóa hình ảnh khỏi ổ cứng, bao gồm hình chính và thumbnail nếu có
	 * @param $image_name Tên của file hình cần xóa
	 * @param $config Thông tin cấu hình nếu có (Không bắt buộc)
	 * @return Không trả về dữ liệu
	 */
	function delete_image($image_name, $config = array()) {
		if (!count($config)) {
			$config = $this->loadConfig();
		}
		// Xử lý để lấy tên thumbnail
		$ext = strrchr($image_name, ".");
		$pos = strrpos($image_name, ".");
		$filename = substr($image_name,0,$pos);
		$thumbnail_name = $filename."_thumbnail".$ext;
		if (is_file($config[$this->name]['image']['path'].$image_name)) {
			@unlink($config[$this->name]['image']['path'].$image_name);
			@unlink($config[$this->name]['thumbnail']['path'].$thumbnail_name);
		}
	}
	//TODO: phan chinh sua
	function getPagesInCategory(&$controller, $alias, $fields, $options = array()) {
		if (isset($options['contain'])) {
			foreach ($options['contain'] as $item) {
				if ($item != $this->name) {
					$this->bindModel(
						array('hasOne' => array(
							"{$item}" => array(
								"className" 	=> "{$item}",
								"foreignKey"	=> "foreign_id"
							)
						)
					), false);
				}
			}
		}

		$pag_options = array_merge(array(
				'conditions'	=>	array(
										"Category.alias" => $alias,
										"News.is_published"	=>1
									),
				'fields'		=>	$fields,
				'order'			=> array(
										'News.news_date desc',
										'News.created desc'
									),
				'joins' => array(
					array(
						'table' => $this->hasAndBelongsToMany['Category']['joinTable'],
						'type' => 'INNER',
						'alias' => 'ReferenceCategory',
						'conditions' => array(
							"{$this->name}.id = ReferenceCategory.page_id"
						)
					),
					array(
						'table' => $this->Category->table,
						'type' => 'INNER',
						'alias' => 'Category',
						'conditions' => array(
							"Category.id = ReferenceCategory.category_id"
						)
					)
				)
			), $options);
			
		$controller->paginate[$this->name] = $pag_options;
		$pages = $controller->paginate($this->name);
		return $pages;
		//$pages = $controller->paginate($this->name);
	}
	
	/**
	 * 
	 * Phương thức để lấy ra bản ghi đầu tiên của danh mục
	 * @param $category_alias
	 * @param $fields
	 * @param $options
	 */
	function getFirstRecordInCategory($category_alias, $fields = array(), $options = array()) {
		if (!isset($options['order'])) {
			$options['order'] = "News.news_date desc, News.created desc";
		}
		
		if (!isset($options['contain'])) {
			$options['contain'] = array();
		}
		if($category_alias != null){
            $first = $this->find('first', array(
                'fields'        => $fields,
                'conditions'    => array(
                						'Category.alias' => $category_alias,
            							'News.is_published'	=> 1	
            						),
            	'order'			=>	array(
										'News.news_date desc',
										'News.created desc'
									),
                'joins'       	=> array(
                    array(
                        'table' => $this->hasAndBelongsToMany['Category']['joinTable'],
                        'alias' => 'Middle',
                        'type'  => 'INNER',
                        'conditions'=> array("Middle.page_id = News.id")
                    ),
                    array(
                        'table' => $this->Category->table, //categories
                        'alias' => 'Category',
                        'type'  => 'INNER',
                        'conditions'=> array("Category.id = Middle.category_id")
                    )
                )
            ) + $options);
        }
		return $first;
	}
    
    function beforeFind($queryData){

		foreach($this->actsAs['Translate'] as $trkey=>$trval){
			if(!is_string($trkey))  $trkey=$trval;
			
			$joinFound=false;
			foreach($queryData['joins'] as $join){
				if($join['alias']=='I18n__'.$trkey){
					$joinFound=true;  break;
				}
			}
			
			if(!$joinFound){
				$newJoin = array(
					'type'=>'LEFT',
					'table'=>'i18n',
					'alias'=>'I18n__'.$trkey,
					'conditions'=>array(
						$this->alias.'.id'=>Set::map(array(
							'type'=>'identifier',
							'value'=>'I18n__'.$trkey.'.foreign_key',
						)
					),
					'I18n__'.$trkey.'.model'=>$this->alias,
					'I18n__'.$trkey.'.locale'=>$this->locale,
					'I18n__'.$trkey.'.field'=>$trkey,
				));
				array_push($queryData['joins'], $newJoin);
			}
		}
		return $queryData;
	}
}
?>